home *** CD-ROM | disk | FTP | other *** search
- #include <LowMem.h>
- #include <A4Stuff.h>
- #include <QuickDraw.h>
- #include <Memory.h>
- #include <Resources.h>
- #include <Fonts.h>
- #include <Dialogs.h>
- #include <QDOffscreen.h>
- #include <string.h>
- #include <stdio.h>
- #include <Timer.h>
-
- int wavePos = 0;
- long waveVal[100] =
- {
- 0x000000, 0x010000, 0x030000, 0x040000, 0x060000, 0x070000, 0x090000, 0x0a0000, 0x0c0000, 0x0d0000,
- 0x0e0000, 0x0f0000, 0x110000, 0x120000, 0x130000, 0x140000, 0x150000, 0x150000, 0x160000, 0x170000,
- 0x170000, 0x180000, 0x180000, 0x180000, 0x180000, 0x180000, 0x180000, 0x180000, 0x180000, 0x180000,
- 0x170000, 0x170000, 0x160000, 0x150000, 0x150000, 0x140000, 0x130000, 0x120000, 0x110000, 0x0f0000,
- 0x0e0000, 0x0d0000, 0x0c0000, 0x0a0000, 0x090000, 0x070000, 0x060000, 0x040000, 0x030000, 0x010000,
- 0x000000,-0x020000,-0x040000,-0x050000,-0x070000,-0x080000,-0x0a0000,-0x0b0000,-0x0c0000,-0x0e0000,
- -0x0f0000,-0x100000,-0x120000,-0x130000,-0x140000,-0x150000,-0x160000,-0x160000,-0x170000,-0x180000,
- -0x180000,-0x190000,-0x190000,-0x190000,-0x190000,-0x190000,-0x190000,-0x190000,-0x190000,-0x190000,
- -0x180000,-0x180000,-0x170000,-0x160000,-0x160000,-0x150000,-0x140000,-0x130000,-0x120000,-0x100000,
- -0x0f0000,-0x0e0000,-0x0d0000,-0x0b0000,-0x0a0000,-0x080000,-0x070000,-0x050000,-0x040000,-0x020000
- };
-
- long waveVal2[100] =
- {
- 0x00000, 0x00400, 0x00800, 0x00c00, 0x01000, 0x01800, 0x02000, 0x02800, 0x03000, 0x03400,
- 0x03800, 0x03c00, 0x04000, 0x04400, 0x04800, 0x04c00, 0x05000, 0x05800, 0x06000, 0x06800,
- 0x07000, 0x07800, 0x08000, 0x08800, 0x09000, 0x09400, 0x09800, 0x09c00, 0x0a000, 0x0a800,
- 0x0b000, 0x0b800, 0x0c000, 0x0c400, 0x0c800, 0x0cc00, 0x0d000, 0x0d400, 0x0d800, 0x0dc00,
- 0x0e000, 0x0e400, 0x0e800, 0x0ec00, 0x0f000, 0x0f800, 0x10000, 0x10800, 0x11000, 0x11400,
- 0x11800, 0x11c00, 0x12000, 0x12400, 0x12800, 0x12c00, 0x13000, 0x13400, 0x13800, 0x13c00,
- 0x14000, 0x14400, 0x14800, 0x14c00, 0x15000, 0x15200, 0x15400, 0x15600, 0x15800, 0x15a00,
- 0x15c00, 0x15e00, 0x16000, 0x16100, 0x16200, 0x16300, 0x16400, 0x16500, 0x16600, 0x16700,
- 0x16900, 0x16b00, 0x16d00, 0x17000, 0x17100, 0x17200, 0x17300, 0x17400, 0x17500, 0x17600,
- 0x17700, 0x17800, 0x17900, 0x17a00, 0x17b00, 0x17c00, 0x17d00, 0x17e00, 0x17f00, 0x18000
- };
-
- char zeroBuffer[1024];
-
- void initWavePlug();
- void initWavePlug()
- {
- int i;
- for(i = 0; i < 1024; i++)
- zeroBuffer[i] = 255;
- }
-
- void disposeWavePlug();
- void disposeWavePlug()
- {
- }
-
- typedef struct {
- TMTask task;
- Ptr mainBaseAddr;
- Size worldBytes;
- Ptr worldBuffer;
- short rowBytes;
- short phase;
- Rect size;
- short offset;
- } MyTaskRec;
-
- void doWavePlug(MyTaskRec* myTask);
- void doScrollerPlug(MyTaskRec* myTask);
- void doFallingDoorPlug(MyTaskRec* myTask);
- void doKaliedPlug(MyTaskRec* myTask);
- void doSlidePlug(MyTaskRec* myTask);
- void doMungePlug(MyTaskRec* myTask);
- void doPixelatorPlug(MyTaskRec* myTask);
- void doInvertPlug(MyTaskRec* myTask);
- void doSnowPlug(MyTaskRec* myTask);
-
- int speed = 1;
- int scale = 0x10000;
- int dir = 0x400;
-
- void doWavePlug(MyTaskRec* myTask)
- {
- short height = myTask -> size.bottom - myTask -> size.top;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
-
- wavePos += speed;
- if(wavePos > 99)
- {
- wavePos -= 100;
- speed++;
- if(speed > 4)
- speed = 1;
- }
- scale += dir * speed;
- if(scale > 0x40000)
- dir = - dir;
- if(scale < 0x08000)
- dir = - dir;
-
- int i;
- for(i = 0; i < height; i++)
- {
- long offset = waveVal[(wavePos + i) % 100] / scale;
-
- if(offset > 0)
- {
- ::BlockMoveData (worldBuffer + i * rowBytes,
- screenBuffer + i * rowBytes + offset,
- myTask->size.right - offset);
- }
- else
- {
- ::BlockMoveData (worldBuffer + i * rowBytes - offset,
- screenBuffer + i * rowBytes,
- myTask->size.right + offset);
- }
- }
- }
-
- int doorPos = 0;
- int doorSpeed = 1;
-
- void doFallingDoorPlug(MyTaskRec* myTask)
- {
- short height = myTask -> size.bottom - myTask -> size.top;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- short width = myTask->size.right;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
-
- doorPos += doorSpeed;
- if(doorPos > 99)
- {
- doorPos -= 100;
- doorSpeed++;
- if(doorSpeed > 4)
- doorSpeed = 1;
- }
-
- int destV;
- int top = ((0x18000 - waveVal2[99 - doorPos]) * height) / 0x18000;
- if(top >= height)
- top = height - 1;
- for(destV = 0; destV < height; destV++)
- {
- char *src = worldBuffer + destV * rowBytes;
- char *dest = screenBuffer + destV * rowBytes;
- if(destV < top)
- {
- ::BlockMoveData (zeroBuffer,
- screenBuffer + destV * rowBytes,
- width);
- }
- else
- {
- int srcV = ((destV - top) * (height)) / (height - top);
- // ::BlockMoveData (worldBuffer + srcV * rowBytes,
- // screenBuffer + destV * rowBytes,
- // width);
- // int off = (destV - top)*(0x18000 - waveVal2[99 - doorPos]) / (0x800 *(height - top));// forward
- int off = (height - destV)*(0x18000 - waveVal2[99 - doorPos]) / (0x400 *(height - top));
-
- ::BlockMoveData (zeroBuffer, screenBuffer + destV * rowBytes, off);
- int xxx;
- char *destbase = screenBuffer + destV * rowBytes + off;
- char *base = worldBuffer + srcV * rowBytes;
- int div = width - off * 2;
-
- for(xxx = 0; xxx < width - 2 * off; xxx++)
- {
- *(destbase + xxx) = *(base + xxx * width / div);
- }
-
- ::BlockMoveData (zeroBuffer, screenBuffer + destV * rowBytes + width - off, off);
- }
- }
- }
-
- long scrollDirs[16] =
- {
- 3, -4, -6, 5, -2, 0, 2, -3, 3, -7, 2, 5, -9, 1, 2, -2
- };
- long scrollPos[16] =
- {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
-
-
- void doScrollerPlug(MyTaskRec* myTask)
- {
- short height = myTask -> size.bottom - myTask -> size.top;
- short width = myTask->size.right;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
-
- int i;
- for(i = 0; i < 16; i++)
- {
- scrollPos[i] = (scrollPos[i] + scrollDirs[i]);
- if(scrollPos[i] > width)
- scrollPos[i] -= width;
- if(scrollPos[i] < 0)
- scrollPos[i] += width;
- }
-
- for(i = 0; i < height; i++)
- {
- long offset = scrollPos[i * 16 / height];
-
- ::BlockMoveData (worldBuffer + i * rowBytes,
- screenBuffer + i * rowBytes + offset,
- width - offset);
- ::BlockMoveData (worldBuffer + i * rowBytes + width - offset,
- screenBuffer + i * rowBytes,
- offset);
- }
- }
-
- int xphase = 0;
- int counter = 0;
-
- void doKaliedPlug(MyTaskRec* myTask)
- {
- short height = myTask -> size.bottom - myTask -> size.top;
- short width = myTask->size.right;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
-
- counter++;
- if(counter > 250)
- {
- counter = 0;
- xphase = (xphase + 1) % 4;
- }
- int i,j;
- if(xphase == 0)
- {
- for(i = 0; i < height / 2; i++)
- {
- for(j = 0; j < width / 2; j++)
- {
- char val = *(worldBuffer + i * rowBytes * 2 + j * 2);
- *(screenBuffer + i * rowBytes + j) = val;
- *(screenBuffer + i * rowBytes + width - j - 1) = val;
- *(screenBuffer + (height - i - 1) * rowBytes + j) = val;
- *(screenBuffer + (height - i - 1) * rowBytes + width - j - 1) = val;
- }
- }
- }
- else if(xphase == 1)
- {
- for(i = 0; i < height / 2; i++)
- {
- for(j = 0; j < width / 2; j++)
- {
- char val = *(worldBuffer + i * rowBytes * 2 + j * 2);
- *(screenBuffer + i * rowBytes + width / 2 - j - 1) = val;
- *(screenBuffer + i * rowBytes + width / 2 + j) = val;
- *(screenBuffer + (height - i - 1) * rowBytes + width / 2 - j - 1) = val;
- *(screenBuffer + (height - i - 1) * rowBytes + width / 2 + j) = val;
- }
- }
- }
- else if(xphase == 2)
- {
- for(i = 0; i < height / 2; i++)
- {
- for(j = 0; j < width / 2; j++)
- {
- char val = *(worldBuffer + i * rowBytes * 2 + j * 2);
- *(screenBuffer + ((height / 2) - i - 1) * rowBytes + j) = val;
- *(screenBuffer + ((height / 2) - i - 1) * rowBytes + width - j - 1) = val;
- *(screenBuffer + (height / 2 + i) * rowBytes + j) = val;
- *(screenBuffer + (height / 2 + i) * rowBytes + width - j - 1) = val;
- }
- }
- }
- else if(xphase == 3)
- {
- for(i = 0; i < height / 2; i++)
- {
- for(j = 0; j < width / 2; j++)
- {
- char val = *(worldBuffer + i * rowBytes * 2 + j * 2);
- *(screenBuffer + ((height / 2) - i - 1) * rowBytes + width / 2 - j - 1) = val;
- *(screenBuffer + ((height / 2) - i - 1) * rowBytes + width / 2 + j) = val;
- *(screenBuffer + (height / 2 + i) * rowBytes + width / 2 - j - 1) = val;
- *(screenBuffer + (height / 2 + i) * rowBytes + width / 2 + j) = val;
- }
- }
- }
-
- }
-
- int slidePos = 0;
-
- void doSlidePlug(MyTaskRec* myTask)
- {
- short height = myTask -> size.bottom - myTask -> size.top;
- short width = myTask->size.right;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
-
- int i;
- slidePos++;
- slidePos = (slidePos % 60);
- for(i = 0; i < height; i++)
- {
- long offset = ((slidePos * i) / 20) % width;
-
- ::BlockMoveData (worldBuffer + i * rowBytes,
- screenBuffer + i * rowBytes + offset,
- width - offset);
- ::BlockMoveData (worldBuffer + i * rowBytes + width - offset,
- screenBuffer + i * rowBytes,
- offset);
- }
- }
-
- char *memLoc = 0;
- void doSnowPlug(MyTaskRec* myTask)
- {
- short height = myTask -> size.bottom - myTask -> size.top;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
-
-
- int i;
- for(i = 0; i < height; i++)
- {
- unsigned char ch;
- char *j;
- char *k;
-
- k = screenBuffer + i * rowBytes;
- for(j = worldBuffer + i * rowBytes; j <= worldBuffer + i * rowBytes + rowBytes - 1 ; j++)
- {
- memLoc++;
- ch = *memLoc % 67;
-
- if(memLoc > (char *)0x00040000)
- memLoc = 0;;
-
- if(ch == 65)
- *k = 0;
- else
- if(ch == 27)
- *k = 255;
- else
- *k = *j;
-
- k++;
- }
- }
- }
-
- int invertPos = 0;
- void doInvertPlug(MyTaskRec* myTask)
- {
- short height = myTask -> size.bottom - myTask -> size.top;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
- short width = myTask->size.right;
-
- invertPos++;
- if(invertPos > 99)
- invertPos = 0;
-
- int i;
- for(i = 0; i < height; i++)
- {
- char *j;
- char *k;
-
- k = screenBuffer + (height - i) * rowBytes;
- for(j = worldBuffer + i * rowBytes + width - 1; j >= worldBuffer + i * rowBytes; j--)
- {
- *k = *j;
- k++;
- }
- }
- }
-
-
- int pixelatorPos = 1;
- static Boolean growing = true;
- void doPixelatorPlug(MyTaskRec* myTask)
- {
- EnterCodeResource ();
- short height = myTask -> size.bottom - myTask -> size.top;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
- short width = myTask->size.right;
-
- pixelatorPos+= growing ? 1 : -1;
-
- if(pixelatorPos > 5)
- {
- pixelatorPos = 5;
- growing = false;
- }
- if(pixelatorPos < 1)
- {
- pixelatorPos = 1;
- growing = true;
- }
-
- int i;
- for(i = 0; i < height; i++)
- {
- char *j;
- char *k;
-
- k = screenBuffer + i * rowBytes;
- for(j = worldBuffer + i * rowBytes; j <= worldBuffer + i * rowBytes + width - 1 ; j+=pixelatorPos)
- {
- long l;
- for(l = 0; l < pixelatorPos && (j+l <= worldBuffer + i * rowBytes + width - 1); l++)
- {
- *k = *j;
- k++;
- }
- }
- }
- ExitCodeResource ();
- }
-
-
-
- int mungePos = 0;
- int mungeVal[100] =
- {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 21, -15, 17, 18, -12, -16, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 21, -15, 17, 18, -12, -16, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, -16, -12, 18, 17, -15, 21,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- };
-
- void doMungePlug(MyTaskRec* myTask)
- {
- EnterCodeResource ();
- short height = myTask -> size.bottom - myTask -> size.top;
- short phase = myTask -> phase;
- short rowBytes = myTask -> rowBytes;
- Ptr worldBuffer = myTask -> worldBuffer;
- Ptr screenBuffer = myTask -> mainBaseAddr;
-
- mungePos++;
- if(mungePos > 99)
- mungePos = 0;
-
- int i;
- for(i = 0; i < height; i++)
- {
- long offset = mungeVal[(mungePos + i) % 100];
-
- if(offset > 0)
- {
- ::BlockMoveData (worldBuffer + i * rowBytes,
- screenBuffer + i * rowBytes + offset,
- rowBytes);
- }
- else
- {
- ::BlockMoveData (worldBuffer + i * rowBytes - offset,
- screenBuffer + i * rowBytes,
- rowBytes);
- }
- }
- ExitCodeResource ();
- }
-
-